package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.exception.CustomException;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.mapper.CategoryMapper;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.DishService;
import com.itheima.reggie.service.SetMealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 分类管理
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {

    @Autowired
  private DishService dishService;

    @Autowired
    private SetMealService setMealService;

    /**
     * 分页查询
     * @param page 当前页面
     * @param pageSize 每页显示条数
     * @return 查询结果
     */
    @Override
    public IPage<Category> getPage(Integer page, Integer pageSize) {
        //构造分页对象
        IPage<Category> p=new Page<>(page,pageSize);
      //构造查询条件
       LambdaQueryWrapper<Category> qw=new LambdaQueryWrapper<>();
        //添加排序条件，根据sort进行排序
       qw.orderByAsc(Category::getSort);
        //执行分页查询条件,结果封装到IPage<Employee> p中
        page(p,qw);
        return p;
    }

    /**
     *删除菜品分类或套餐分类
     * @param categoryId
     */
    @Override
    public void removeCategory(Long  categoryId) {
        //1.查询该分类下是否还包含对应的菜品,如果有数据,则抛出异常

        //category_id 菜品分类Id
        //select *from Dish where category_id= xxx(你传的Id);
        LambdaQueryWrapper<Dish> qw=new LambdaQueryWrapper<>();
        qw.eq(Dish::getCategoryId,categoryId);
        //由于一个菜品分类下面可能有多个数据 所以要用集合
        List<Dish> dishList = dishService.list(qw);
        if (dishList!=null&&dishList.size()>0){

            throw new CustomException("当前有对应的菜品信息,分类删除失败");
        }


        //2.查询该分类下是否还包含对应的套餐,如果有数据,则抛出异常
        LambdaQueryWrapper<Setmeal> qw1=new LambdaQueryWrapper<>();
        qw1.eq(Setmeal::getCategoryId,categoryId);
        //由于一个菜品分类下面可能有读个数据 所以要用集合
        List<Setmeal> setmealList = setMealService.list(qw1);
        //新建一个list对象，默认值是空，而非null,所以两个都要比较
        if (setmealList!=null&&setmealList.size()>0){
            throw new CustomException("当前有对应的菜品信息,分类删除失败");
        }

        //3.如果没有对应的数据则删除
     removeById(categoryId);
    }

    /**
     *对菜品添加里的菜品分类进行查询
     * @param category
     * @return
     */
    @Override
    public List<Category> getListByCondition(Category category) {
        //根据类型作为条件去做查询
        //select*from category where type=1
        LambdaQueryWrapper<Category> qw=new LambdaQueryWrapper<>();
        //根据条件去做查询
        qw.eq(Category::getType,category.getType());
        //将查询数据返回
        return list(qw);
    }


}
/*
* 简述
判断一个list集合是否为空，我们的惯性思维是判断list是否等于null即可，但是在Java中，
 list集合为空还是为null，这是两码事。新建一个list对象，默认值是空，而非null；

引用例子:
举个形象的例子，我有一个空着的水杯（list），而你没有，那你是null，我的size为0。
* 你想装水就需要自己去买个水杯（new ArrayList();），但是我就可以直接装水（list.add(水)）。
* 你要是没有杯子直接倒水，水就流出去啦（空指针异常）。
* */